﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using CancioneroCONFAD.DAL;
using CancioneroCONFAD.Utilidades;
using SubSonic.Repository;

namespace CancioneroCONFAD.Formularios
{
    
    public partial class CrearLista : Form
    {
        SimpleRepository _repository=new SimpleRepository("Cancionero",SimpleRepositoryOptions.None);
        private IList<TipoAlabanza> _tiposAlabanzaSeleccionados = new List<TipoAlabanza>();
        public CrearLista()
        {
            InitializeComponent();
        }

        private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                var row = dgCanciones.Rows[e.RowIndex];
                var idCancion = int.Parse(row.Cells["Id"].Value.ToString());
                var nombreCancion = row.Cells["Titulo"].Value.ToString();
                var objetoNuevo = new {Id = idCancion, Titulo = nombreCancion};
                if (!ckLstCanciones.Items.Contains(objetoNuevo))
                {
                    ckLstCanciones.Items.Add(objetoNuevo);

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }

            //lbCancionesSeleccionadas.ValueMember = "Titulo";
        }

        private void CrearLista_Load(object sender, EventArgs e)
        {
            try
            {
                ckLstCanciones.DisplayMember = "Titulo";
                ckLstCanciones.ValueMember = "Id";

                var canciones1 = (from c in _repository.All<Cancion>()
                                  select c).ToList();
                var canciones = canciones1.Select(c => new
                                                           {
                                                               c.Id,
                                                               c.Titulo,
                                                               c.Artista,
                                                               Letra =
                                                           c.FragmentosCompleto.Length > 20
                                                               ? c.FragmentosCompleto.Substring(0, 19).Replace('\n', ' ') + "..."
                                                               : c.FragmentosCompleto.Replace('\n', ' '),
                                                               c.TipoAlabanza
                                                           });
                bindingSource1.DataSource = canciones;
                dgCanciones.DataSource = bindingSource1;
                dgCanciones.AutoGenerateColumns = true;
                if (dgCanciones != null)
                {
                    if (dgCanciones.Columns != null)
                    {
                        if (dgCanciones.Columns.Contains("Id"))
                        {
                            dgCanciones.Columns["Id"].Visible = false;
                        }
                    }
                }
                dgCanciones.AutoResizeColumns(
                    DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void NuevaBusqueda(object sender, EventArgs e)
        {
            try
            {
                RealizarBusqueda();
            }catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }

        }

        private void EliminarItem(object sender, EventArgs e)
        {
            try
            {
                ckLstCanciones.Items.Remove(ckLstCanciones.SelectedItem);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void RealizarBusqueda()
        {
            var texto = txtBusqueda.Text;
            var canciones1 = (from c in _repository.All<Cancion>()
                              select c).ToList();
            var canciones2 = canciones1.Where(x => x.Titulo.Contains(texto) || x.FragmentosCompleto.Contains(texto));
            var canciones3 = _tiposAlabanzaSeleccionados.Count() > 0
                                 ? canciones2.Where(x => _tiposAlabanzaSeleccionados.Contains(x.TipoCancion))
                                 : canciones2;
            var canciones = canciones3.Select(c => new
            {
                c.Id,
                c.Titulo,
                c.Artista,
                Letra = c.FragmentosCompleto.Length > 20 ? c.FragmentosCompleto.Substring(0, 19).Replace('\n', ' ') + "..." : c.FragmentosCompleto.Replace('\n', ' '),
                c.TipoAlabanza
            });

            bindingSource1.DataSource = canciones;
            dgCanciones.DataSource = bindingSource1;
            dgCanciones.AutoGenerateColumns = true;

            dgCanciones.AutoResizeColumns(
                DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
        }

        private void chkModerada_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chkModerada.Checked)
                {
                    _tiposAlabanzaSeleccionados.Add(TipoAlabanza.Moderada);

                }
                else
                {
                    _tiposAlabanzaSeleccionados.Remove(TipoAlabanza.Moderada);
                }
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void chkJubilo_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chkJubilo.Checked)
                {
                    _tiposAlabanzaSeleccionados.Add(TipoAlabanza.Jubilo);

                }
                else
                {
                    _tiposAlabanzaSeleccionados.Remove(TipoAlabanza.Jubilo);
                }
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void chkAdoracion_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                if (chkAdoracion.Checked)
                {
                    _tiposAlabanzaSeleccionados.Add(TipoAlabanza.Adoracion);

                }
                else
                {
                    _tiposAlabanzaSeleccionados.Remove(TipoAlabanza.Adoracion);
                }
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            try
            {
                chkAdoracion.Checked = false;
                chkJubilo.Checked = false;
                chkModerada.Checked = false;
                _tiposAlabanzaSeleccionados.Clear();
                
                ckLstCanciones.Items.Clear();
                txtBusqueda.Clear();
                RealizarBusqueda();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgCanciones.SelectedRows.Count>0)
                {
                    var row = dgCanciones.SelectedRows[0];
                    var idCancion = int.Parse(row.Cells["Id"].Value.ToString());
                    var nombreCancion = row.Cells["Titulo"].Value.ToString();
                    var objetoNuevo = new {Id = idCancion, Titulo = nombreCancion};
                    if (!ckLstCanciones.Items.Contains(objetoNuevo))
                    {
                        ckLstCanciones.Items.Add(objetoNuevo);

                    }
                }
                else
                {
                    MessageBox.Show("Debe seleccionar una canción a agregar", "Validación", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnGenerar_Click(object sender, EventArgs e)
        {
            try
            {
                if (CamposValidos())
                {
                    
                    var items = ckLstCanciones.Items;
                    var canciones = new List<Cancion>();
                    foreach (var item in items)
                    {
                        var t = item.GetType();
                        var p = t.GetProperty("Id");
                        var idCancion = int.Parse(p.GetValue(item, null).ToString());
                        var cancion = _repository.Single<Cancion>(idCancion);
                        //presentacion.RetornarPresentacion(cancion.Titulo, cancion.Letra);
                        canciones.Add(cancion);
                    }
                    var formGenerar = new GenerarLista(canciones);
                    formGenerar.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (CamposValidos())
                {
                    var items = ckLstCanciones.Items;
                    var canciones = new List<Cancion>();
                    foreach (var item in items)
                    {
                        var t = item.GetType();
                        var p = t.GetProperty("Id");
                        var idCancion = int.Parse(p.GetValue(item, null).ToString());
                        var cancion = _repository.Single<Cancion>(idCancion);
                        canciones.Add(cancion);
                    }
                    var frm = new GuardarListaEnBase(canciones);
                    frm.Show();
                    /*if (frm.ListaGuardada)
                    {
                        btnGuardar.Enabled = false;
                        btnLimpiar.Enabled = false;
                    }*/
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ha ocurrido un error:\n" + ex.Message, "Oops lo sentimos", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }

        private bool CamposValidos()
        {
            var camposValidos = true;
            var mensajeMostrar = "";
            if(ckLstCanciones.Items.Count<=0)
            {
                camposValidos = false;
                mensajeMostrar += "\nDebe seleccionar almenos una canción.";
            }
            if (!camposValidos)
                MessageBox.Show("Revise lo siguiente:" + mensajeMostrar);
            return camposValidos;
        }
    }
}
